package com.yeskery.transfer.core;

import org.springframework.stereotype.Component;

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * 系统的资源类
 * @author shuangjiang.du
 * @date 2018-12-13 09:43
 * @version 1.0
 */
@Component
public class Resource {

	/** 承载数据的<code>Map</code>对象 */
	private Map<Key, Object> dataMap = new ConcurrentHashMap<>();

	/**
	 * 增加数据的方法
	 * @param key key
	 * @param data 数据
	 */
	public void add(Key key, Object data) {
		dataMap.put(key, data);
	}

	/**
	 * 获取数据的方法
	 * @param key key
	 * @return 对应的数据
	 */
	public Object get(Key key) {
		return dataMap.get(key);
	}

	/**
	 * 获取数据的方法
	 * @param key key
	 * @param tClass 对应的类型
	 * @param <T> 强制转换的类型
	 * @return 对应的数据
	 */
	@SuppressWarnings("unchecked")
	public <T> T get(Key key, Class<T> tClass) {
		Object data = get(key);
		return data == null ? null : (tClass.isAssignableFrom(data.getClass()) ? (T) data : null);
	}

	/**
	 * 获取数据的方法，如果没有获取到数据，则返回给定的默认值
	 * @param key key
	 * @param defaultValue 默认值
	 * @param <T> 强制转换的类型
	 * @return 对应的数据，如果没有获取到数据，则返回给定的默认值
	 */
	@SuppressWarnings("unchecked")
	public <T> T get(Key key, T defaultValue) {
		Object data = get(key);
		return data == null ? defaultValue : (defaultValue.getClass().isAssignableFrom(data.getClass()) ? (T) data : null);
	}

}
